package application;

import exceptions.ExecutionException;
import exceptions.AnalyseException;
import exceptions.NoMainFoundError;
import java.io.InputStream;
import java.util.Map;

/**
 * Interface representant une application d'analyse grammaticale
 * @author O.Riad
 * @author R.Dubos
 */
public interface InterfaceApplication {

    public static int MODE_NORMAL = 1;
    public static int MODE_DEBUG = 2;

    /**
     * Methode se chargeant d'executer le code source de l'application
     *
     * @return Int Le résultat de l'exécution
     */
    public int execute() throws NoMainFoundError, ExecutionException;

    /**
     * Ferme l'application
     */
    public void close();

    /**
     * Ajoute un fichier contenant le
     * code à exécuter 
     * @param input 
     */
    public void addProgram(InputStream input);

    /**
     * Lance l'analyse grammaticale en mode debug
     * @param input Fichier contenant le code source
     * @throws AnalyseException 
     */
    public void initDebug(InputStream input) throws AnalyseException;

    /**
     * Lance l'analyse grammaticale en mode normal
     * @param input Fichier contenant le code source
     * @throws AnalyseException 
     */
    public void initProgram(InputStream input) throws AnalyseException;
    
    //TODO: Commenter méthode : debugExecNextLine()
    public void debugExecNextLine() throws ExecutionException;
    
    /*
     * Passer en mode dit "debug"
     */
    public void setDebug();
    
    /**
     * Passer en mode dit "normal"
     */
    public void setNormal();
    
    /**
     * Renvoie la Map representant les variables et leur contenu
     * @return Map des variables et de leur contenu
     */
    public Map<String, Integer> getVariable();
}
